package com.linkstec.mail;

import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.linkstec.util.ConfigUtil;

public class MysendMail {

	private static final Logger logger = LogManager.getLogger();
	private MimeMessage mimeMsg; // MIME邮件对象

	private Session session; // 邮件会话对象
	private Properties props; // 系统属性
//	private boolean needAuth = false; // smtp是否需要认证

	private String username = ""; // smtp认证用户名和密码
	private String password = "";

	private Multipart mp; // Multipart对象,邮件内容,附件等内容均添加到其中后再生成MimeMessage对象

	public MysendMail() {

		// setSmtpHost(getConfig.mailHost);//如果没有指定邮件服务器,就从getConfig类中获取
		createMimeMessage();

	}

	public MysendMail(String smtp) {

		setSmtpHost(smtp);
		createMimeMessage();

	}

	/**
	 * @param hostName
	 *            String
	 */
	public void setSmtpHost(String hostName) {

		if (props == null)
			props = System.getProperties(); // 获得系统属性对象

		props.put("mail.smtp.host", hostName); // 设置SMTP主机

	}

	/**
	 * @return boolean
	 */
	public boolean createMimeMessage() {
		try {
			session = Session.getDefaultInstance(props, null); // 获得邮件会话对象
		}

		catch (Exception e) {
			logger.error("获取邮件会话对象时发生错误！", e);
			return false;
		}

		try {

			mimeMsg = new MimeMessage(session); // 创建MIME邮件对象
			mp = new MimeMultipart();

			return true;

		} catch (Exception e) {

			logger.error("创建MIME邮件对象失败！", e);
			return false;
		}
	}

	/**
	 * @param need
	 *            boolean
	 */
	public void setNeedAuth(boolean need) {

		if (props == null)
			props = System.getProperties();

		if (need) {

			props.put("mail.smtp.auth", "true");
		} else {

			props.put("mail.smtp.auth", "false");
		}
	}

	/**
	 * @param name
	 *            String
	 * @param pass
	 *            String
	 */
	public void setNamePass(String name, String pass) {
		username = name;
		password = pass;
	}

	/**
	 * @param mailSubject
	 *            String
	 * @return boolean
	 */
	public boolean setSubject(String mailSubject) {
		try {
			mimeMsg.setSubject(mailSubject);
			return true;
		} catch (Exception e) {
			logger.error("设置邮件主题发生错误！");
			return false;
		}
	}

	/**
	 * @param mailBody
	 *            String
	 */
	public boolean setBody(String mailBody) {
		try {
			BodyPart bp = new MimeBodyPart();
			bp.setContent(
					"<meta http-equiv=Content-Type content=text/html; charset=gb2312>"
							+ mailBody, "text/html;charset=GB2312");
			mp.addBodyPart(bp);

			return true;
		} catch (Exception e) {
			logger.error("设置邮件正文时发生错误！", e);
			return false;
		}
	}

	/**
	 * @param name
	 *            String
	 * @param pass
	 *            String
	 */
	public boolean addFileAffix(String filename) {

		try {
			BodyPart bp = new MimeBodyPart();
			FileDataSource fileds = new FileDataSource(filename);
			bp.setDataHandler(new DataHandler(fileds));
			bp.setFileName(fileds.getName());

			mp.addBodyPart(bp);

			return true;
		} catch (Exception e) {
			logger.error("增加邮件附件：" + filename + "发生错误！", e);
			return false;
		}
	}

	/**
	 * @param name
	 *            String
	 * @param pass
	 *            String
	 */
	public boolean setFrom(String from) {
		try {
			mimeMsg.setFrom(new InternetAddress(from)); // 设置发信人
			return true;
		} catch (Exception e) {
			return false;
		}
	}

	/**
	 * @param name
	 *            String
	 * @param pass
	 *            String
	 */
	public boolean setTo(String to) {
		if (to == null)
			return false;

		try {
			mimeMsg.setRecipients(Message.RecipientType.TO, InternetAddress
					.parse(to));
			return true;
		} catch (Exception e) {
			return false;
		}

	}

	/**
	 * @param name
	 *            String
	 * @param pass
	 *            String
	 */
	public boolean setCopyTo(String copyto) {
		if (copyto == null)
			return false;
		try {
			mimeMsg.setRecipients(Message.RecipientType.CC,
					(Address[]) InternetAddress.parse(copyto));
			return true;
		} catch (Exception e) {
			return false;
		}
	}
	/**
	 * 
	 * @param cc
	 * @return
	 */
	public boolean setCc(List<String> cc) {
		
        if(cc != null) {
        	InternetAddress[] ccAddress = new InternetAddress[cc.size()];
        	for(int k = 0;k<cc.size();k++){
        		String emailAddress = cc.get(k);
    			try {
					ccAddress[k]=new InternetAddress(emailAddress);
				} catch (AddressException e) {
					e.printStackTrace();
				}
        	}
        	try {
				mimeMsg.addRecipients(Message.RecipientType.CC, ccAddress);
			} catch (MessagingException e) {
				e.printStackTrace();
				return false;
			}
        }
        return true;
	}
	/**
	 * 
	 * @param bcc
	 * @return
	 */
	public boolean setBcc(List<String> bcc) {
		
		if(bcc != null) {
			InternetAddress[] bccAddress = new InternetAddress[bcc.size()];
			for(int k = 0;k<bcc.size();k++){
				String emailAddress = bcc.get(k);
				try {
					bccAddress[k]=new InternetAddress(emailAddress);
				} catch (AddressException e) {
					e.printStackTrace();
				}
			}
			try {
				mimeMsg.addRecipients(Message.RecipientType.BCC, bccAddress);
			} catch (MessagingException e) {
				e.printStackTrace();
				return false;
			}
		}
		return true;
	}

	/**
	 * @param name
	 *            String
	 * @param pass
	 *            String
	 * @throws Exception 
	 */
	public boolean sendout() throws Exception {
		Transport transport = null;
		try {
			mimeMsg.setContent(mp);
			mimeMsg.saveChanges();

			Session mailSession = Session.getInstance(props, null);
			transport = mailSession.getTransport("smtp");
			transport.connect((String) props.get("mail.smtp.host"), username,
					password);
//			transport.sendMessage(mimeMsg, mimeMsg
//					.getRecipients(Message.RecipientType.TO));
			//包括密送
			transport.sendMessage(mimeMsg, mimeMsg
					.getAllRecipients());
//			transport.send(mimeMsg);

			return true;
		} catch (Exception e) {

			logger.error("邮件发送失败！", e);
			throw e;
		} finally {
			try {
				transport.close();
			} catch (MessagingException e) {
				logger.error("", e);
			}
		}

	}
	/**
	 * 发送电子邮件到指定的信箱
	 * @param title 邮件标题 
	 * @param mailbody 邮件内容【一个网页，表格ok】
	 * @param sendTo 发送给谁 252745361@qq.com
	 * @param from 从哪些发送 397519892@qq.com
	 * @param passwd 密码 expoubophdyhbgce
	 * @param sendStmp 发送邮件的smtp smtp.sohu.com [smtp.163.com] [smtp.sina.com]
	 * @throws Exception 
	 */
	public void send(String title,String mailbody,String sendTo,String from,String passwd,String sendStmp) throws Exception{
		
		//指明让那个smtp转发(腾讯)
		MysendMail themail = new MysendMail(sendStmp);
		
		//校验身份
		themail.setNeedAuth(true);
		
		//邮件标题
		if(themail.setSubject(title) == false) return;
		//将要发送的 内容放入邮件体 
		if(themail.setBody(mailbody) == false) return;
		
		//发送到哪里
		if(themail.setTo(sendTo) == false) return;
		
		//谁发送的
		if(themail.setFrom(from) == false) return;
		//增加CC功能
		List<String> cc = new ArrayList<String>();
//		cc.add("liuyl@linkstec.com");
		if(themail.setCc(cc) == false) return;
		//增加BCC功能
		List<String> bcc = new ArrayList<String>();
//		bcc.add("liuyl@linkstec.com");
		if(themail.setBcc(bcc) == false) return;

	
	
	//	if(themail.addFileAffix("e:\\butterfly.gif") == false) return;
		
			
	//	if()
		//将在qq网站上的邮件用户名和 密码 放入邮件体 
		themail.setNamePass("397519892",passwd);
		
		//发送
		if(themail.sendout() == false) return;
	}
	/**
	 * 发送电子邮件到指定的信箱
	 * @param title 邮件标题 
	 * @param mailbody 邮件内容【一个网页，表格ok】
	 * @param sendTo 发送给谁 252745361@qq.com
	 * @param cc 抄送
	 * @param bcc 密送
	 * @throws Exception 
	 */
	public static void send(String title,String mailbody,String sendTo, List<String> cc, List<String> bcc) throws Exception{
		
		//指明让那个smtp转发(腾讯)
		MysendMail themail = new MysendMail(ConfigUtil.getProperty("smtp.host", "smtp.qq.com"));
		
		//校验身份
		themail.setNeedAuth(true);
		
		//邮件标题
		if(themail.setSubject(title) == false) return;
		
		//将要发送的 内容放入邮件体 
		if(themail.setBody(mailbody) == false) return;
		
		//发送到哪里
		if(themail.setTo(sendTo) == false) return;
		
		//谁发送的
		if(themail.setFrom(ConfigUtil.getProperty("smtp.from", "397519892@qq.com")) == false) return;

		//增加CC功能
		if(themail.setCc(cc) == false) return;

		//增加BCC功能
		if(themail.setBcc(bcc) == false) return;

		//将在qq网站上的邮件用户名和 密码 放入邮件体 
		themail.setNamePass(ConfigUtil.getProperty("smtp.auth.user", "397519892@qq.com"),
				ConfigUtil.getProperty("smtp.auth.password", ""));
		
		//发送
		if(themail.sendout() == false) return;
	}
}